package com.xfusion.chatglm.data.domain.openai.service.rule.impl;

import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.xfusion.chatglm.data.domain.openai.annotation.LogicStrategy;
import com.xfusion.chatglm.data.domain.openai.model.aggregates.ChatProcessAggregate;
import com.xfusion.chatglm.data.domain.openai.model.entity.MessageEntity;
import com.xfusion.chatglm.data.domain.openai.model.entity.RuleLogicEntity;
import com.xfusion.chatglm.data.domain.openai.model.entity.UserAccountQuotaEntity;
import com.xfusion.chatglm.data.domain.openai.model.valobj.LogicCheckTypeVO;
import com.xfusion.chatglm.data.domain.openai.service.rule.ILogicFilter;
import com.xfusion.chatglm.data.domain.openai.service.rule.factory.DefaultLogicFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 敏感词过滤器
 */
@Slf4j
@Component
@LogicStrategy(logicMode = DefaultLogicFactory.LogicModel.SENSITIVE_WORD)
public class SensitiveWordFilter implements ILogicFilter<UserAccountQuotaEntity> {
    //github开源框架
    @Resource
    private SensitiveWordBs words;
    @Value("${app.config.white-list}")
    private String whiteListStr;


    /**
     * 过滤敏感词
     * @param chatProcessAggregate 聊天聚合对象
     * @param data 用户账户配额对象
     * @return 过滤结果
     * @throws Exception 异常
     */
    @Override
    public RuleLogicEntity<ChatProcessAggregate> filter(ChatProcessAggregate chatProcessAggregate,UserAccountQuotaEntity data) throws Exception {
        //白名单用户不做敏感词处理
        if (chatProcessAggregate.isWhiteList(whiteListStr)){
            return RuleLogicEntity.<ChatProcessAggregate>builder()
                    .type(LogicCheckTypeVO.SUCCESS).data(chatProcessAggregate).build();
        }
        //创建新的聊天聚合对象，这个的作用是为了避免对原始对象进行修改，将修改敏感词后的新的应答内容赋值给新的对象
        ChatProcessAggregate newChatProcessAggregate = new ChatProcessAggregate();
        newChatProcessAggregate.setOpenid(chatProcessAggregate.getOpenid());
        newChatProcessAggregate.setModel(chatProcessAggregate.getModel());

        //遍历并处理聊天消息
        //获取原始的chatProcessAggregate对象中的所有消息列表（message），使用java8的流式编程对消息列表进行处理，针对每一条MessageEntity对象执行下列操作：
        //1.提取消息内容
        //2.使用敏感词过滤对内容进行过滤替换，将处理过的文字数据存到replace中，并返回一个新的MessageEntity对象，保留原消息的role和name属性
        //3.将处理后的MessageEntity对象添加到新的消息列表中
        List<MessageEntity> newMessages = chatProcessAggregate.getMessages().stream()
                .map(message->{
                    String content = message.getContent();
                    String replace = words.replace(content);
                    return MessageEntity.builder()
                            .role(message.getRole())
                            .name(message.getName())
                            .content(replace)
                            .build();
                })
                .collect(Collectors.toList());
        //再次赋值！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
        newChatProcessAggregate.setMessages(newMessages);

        return RuleLogicEntity.<ChatProcessAggregate>builder()
                .type(LogicCheckTypeVO.SUCCESS).data(newChatProcessAggregate).build();
    }
}
